package uy.org.softtech.cssuite.repositorios;

import java.util.Set;

import uy.org.softtech.cssuite.entidad.sistema.Tarea;
import uy.org.softtech.cssuite.excepciones.EntidadNoActualizadaException;
import uy.org.softtech.cssuite.excepciones.EntidadNoEncontradaException;

/**
 * Interfaz por medio de la cual se acceden a los datos en la base de datos de las tareas programadas.
 * 
 * @author fabian.lobo
 */
public interface RepositorioTareas {
	
	/**
	 * Busca en la base de datos el registro asociado a una tarea programada
	 * 
	 * @param nombreInstancia - Nombre de la instancia ejecutora de la tarea
	 * @return el registro relacionado a la instancia dada.
	 * @throws EntidadNoEncontradaException si no se encuentra ningún registro con los datos proporcionados.
	 * @author fabian.lobo
	 */
	Tarea buscarPorInstancia(String nombreInstancia) throws EntidadNoEncontradaException;
	
	/**
	 * Actualiza los datos del registro en la base de datos
	 * 
	 * @param tarea - Tarea con los datos a actualizar
	 * @param servicio - Nombre del servicio en donde se actualizan los datos
	 * @return el registro actualizado
	 * @throws EntidadNoActualizadaException si no se pueden actualizar los datos en la base de datos.
	 * @author fabian.lobo
	 */
	Tarea actualizar(Tarea tarea, String servicio) throws EntidadNoActualizadaException;
	
	/**
	 * Retorna el registro de tarea asociado al identificador dado
	 * 
	 * @param id - Identificador de la tarea
	 * @throws EntidadNoEncontradaException si no se encuentra un registro con ese ID
	 * @author fabian.lobo
	 */
	Tarea buscarTarea(Long id) throws EntidadNoEncontradaException;

	/**
	 * Retorna el número de tareas programadas que están actualmente en ejecución
	 * 
	 * @author fabian.lobo
	 */
	Integer tareasEnEjecucion();

	/**
	 * Retorna una lista con informacion de las tareas programadas registradas en la aplicación
	 * 
	 * @author fabian.lobo
	 */
	Set<Tarea> listarTareas();

}
